package vista;

import java.net.URL;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.swing.JOptionPane;

import controlador.CdPatente;
import controlador.CdProductos;
import controlador.CdProveedores;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import entidades.Patente;
import entidades.Productos;
import entidades.Proveedor;
import entidades.iOperaciones;

public class ClCtrProductos implements Initializable, iOperaciones {
	
	
	@FXML
	TextField txtCodigoProductos;
	@FXML
	TextField txtNombreProductos;
	@FXML
	TextField txtExistenciaProductos;
	@FXML
	TextField txtPrecioProductos;
	@FXML
	Button btnGuardarProductos;
	@FXML
	Button btnEliminarProductos;
	
	
	
	@FXML
	TableView <Object>tvProductos;
	@FXML
	TableColumn tcCodigoProductos;
	@FXML
	TableColumn tcNombreProductos;
	@FXML
	TableColumn tcExistenciaProductos;
	@FXML
	TableColumn tcPrecioProductos;

	
	@FXML
	TableView <Object>tvProductosGene;
	@FXML
	TableColumn tcCodigoGene;
	@FXML
	TableColumn tcNombreGene;
	@FXML
	TableColumn tcExistenciaGene;
	@FXML
	TableColumn tcPrecioGene;
	@FXML
	TableColumn tcProveedor;	

	@FXML
	ComboBox cmbProveedor;
	@FXML
	TabPane tpProductos;
	
	@FXML 
	Tab tabProductosGral;
	
	@FXML 
	Tab tabMedicamentosPate;
	
	@FXML 
	Tab tabMedicamentosGene;
	
	
	private vista.MainApp mainApp;
	private boolean esnuevo=true;
	private Productos producto;
	private CdProductos datosProducto=new CdProductos();
	List<Object>lista=new ArrayList<Object>();

	private CdProveedores datosProveedor = new CdProveedores();
	List<Object>listaProveedores=new ArrayList<Object>();
	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {
		// TODO Auto-generated method stub
		llenarTvProductos();
		llenarCombo();
		btnGuardarProductos.setOnAction(new btnGuardarProductos_Click());
		btnEliminarProductos.setOnAction(new btnEliminarProductos_Click());
		tvProductos.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>(){

			@Override
			public void changed(ObservableValue<? extends Object> observable,
					Object oldValue, Object newValue) {
				// TODO Auto-generated method stub
				datosProducto(newValue);
				
			}
			
		});
	}
	
	private void datosProducto(Object seleccionado){
		producto=(Productos) seleccionado;
		if(producto!=null){
		esnuevo=false;
		txtCodigoProductos.setText(producto.getCodigo());
		txtNombreProductos.setText(producto.getNombre());
		txtExistenciaProductos.setText(Integer.toString(producto.getExistencia()));
		txtPrecioProductos.setText(Float.toString(producto.getPrecio()));
		cmbProveedor.setValue((Proveedor)producto.getProveedor());
				
		
		
		}
		
	}
	

	public void limpiarCajasGeneral(){
		esnuevo=true;
		txtCodigoProductos.setText("");
		txtNombreProductos.setText("");
		txtExistenciaProductos.setText("");
		txtPrecioProductos.setText("");

	}
	
	public void llenarCombo(){
		try {
			listaProveedores=datosProveedor.listar();
		} catch (ClassNotFoundException | InstantiationException
				| IllegalAccessException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ObservableList<Object>listaObs=FXCollections.observableArrayList(listaProveedores);
		cmbProveedor.getItems().addAll(listaObs);
		
		
	}
	
	public void llenarTvProductos(){
		
		try {
			lista=listar();
		} catch (ClassNotFoundException | InstantiationException
				| IllegalAccessException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ObservableList<Object>listaObs=FXCollections.observableArrayList(lista);
		tcCodigoProductos.setCellValueFactory(new PropertyValueFactory<Productos,Integer>("codigo"));
		tcNombreProductos.setCellValueFactory(new PropertyValueFactory<Productos,String>("nombre"));
		tcExistenciaProductos.setCellValueFactory(new PropertyValueFactory<Productos,Integer>("existencia"));
		tcPrecioProductos.setCellValueFactory(new PropertyValueFactory<Productos,Float>("precio"));
		tcProveedor.setCellValueFactory(new PropertyValueFactory<Productos,Proveedor>("proveedor"));
		tvProductos.setItems(listaObs);
	}
	
	private class btnGuardarProductos_Click implements EventHandler<ActionEvent>
	{
			@Override
		public void handle(ActionEvent arg0) {
				
				if(esnuevo==true){
					producto=new Productos(txtCodigoProductos.getText(),txtNombreProductos.getText(),(Integer.parseInt(txtExistenciaProductos.getText())),(Float.parseFloat(txtPrecioProductos.getText())),(Proveedor)cmbProveedor.getValue());				
					try{
						
						if(agregar(producto)){
							JOptionPane.showMessageDialog(null, "registro existoso");
							
							llenarTvProductos();
							limpiarCajasGeneral();
							
						}
						else{
							System.out.println("registro fallido");
						}	
						
					}
					catch(Exception e){
						System.out.print(e);
						esnuevo=false;
					}
					
				}
				else{
					producto.setCodigo(txtCodigoProductos.getText());
					producto.setNombre(txtNombreProductos.getText());
					producto.setExistencia(Integer.parseInt(txtExistenciaProductos.getText()));
					producto.setPrecio(Float.parseFloat(txtPrecioProductos.getText()));
					producto.setProveedor((Proveedor)cmbProveedor.getValue());
					
					
					try{
						
						if(actualizar(producto)){
							System.out.println("Modificacion exitosa");
							llenarTvProductos();
							limpiarCajasGeneral();
						}
						else{
							System.out.println("Modificacion fallida");
						}	
						
					}
					catch(Exception e){
						System.out.print(e);
						esnuevo=false;
					}
				}
			}
			
	
	}
	private class btnEliminarProductos_Click implements EventHandler<ActionEvent>{

		@Override
		public void handle(ActionEvent arg0) {
			// TODO Auto-generated method stub
				
			producto.setCodigo(txtCodigoProductos.getText());
			producto.setNombre(txtNombreProductos.getText());
			producto.setExistencia(Integer.parseInt(txtExistenciaProductos.getText()));
			producto.setPrecio(Float.parseFloat(txtPrecioProductos.getText()));
			try{
				
				if(eliminar(producto)){
					System.out.println("cliente eliminado exitosamente");
					llenarTvProductos();
					limpiarCajasGeneral();
				}
				else{
					System.out.println("operacin  fallida");
				}	
				
			}
			catch(Exception e){
				System.out.print(e);
				esnuevo=false;
			}	
		}
			
		}
	public void setMainApp(vista.MainApp mainApp){
		this.mainApp=mainApp;
	}

	@Override
	public boolean agregar(Object nuevo) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException, SQLException {
		// TODO Auto-generated method stub
		return datosProducto.agregar(nuevo);
	}

	@Override
	public boolean actualizar(Object modificado) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException, SQLException {
		// TODO Auto-generated method stub
		return datosProducto.actualizar(modificado);
	}

	@Override
	public boolean eliminar(Object eliminado) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException, SQLException {
		// TODO Auto-generated method stub
		return datosProducto.eliminar(eliminado);
	}

	@Override
	public List<Object> listar() throws ClassNotFoundException,
			InstantiationException, IllegalAccessException, SQLException {
		// TODO Auto-generated method stub
		return datosProducto.listar();
	}

}

